#!/usr/bin/env python3

import glob
import json
import re
import sys

# Global variable
PORT_ATTRIBUTES = ["default_brkout_mode"]
OPTIONAL_PORT_ATTRIBUTES = ["fec", "autoneg", "port_type", "subport", "role"]
PORT_REG = "Ethernet(\d+)"
HWSKU_JSON = '*hwsku.json'
INTF_KEY = "interfaces"

def usage():
    print("Usage: " + sys.argv[0] + " <hwsku_json_file>")
    sys.exit(1)

def check_port_attr(port_attr):
    for each_key in port_attr:
        if each_key not in PORT_ATTRIBUTES and each_key not in OPTIONAL_PORT_ATTRIBUTES:
            print("Error: " + each_key + " is not the correct Port attribute.")
            return False
        if not port_attr[each_key]:
            print("Error: " + each_key + " has no value.")
            return False
        if not isinstance(port_attr[each_key], str):
            print("Error:value type of  " + each_key + " must be string.")
            return False
    return True

def check_file(hwsku_json_file):
    try:
        hwsku_cap_file = open(hwsku_json_file,"r")
        hwsku_data_data = hwsku_cap_file.read()
        hwsku_dict = json.loads(hwsku_data_data)

        for each_port in hwsku_dict[INTF_KEY]:
            # Validate port at top level
            port_id = re.search(PORT_REG, each_port)
            if port_id is None:
                print("Error: Unknown Interface " + str(each_port) + " at top level")
                return False

            port_attr = hwsku_dict[INTF_KEY][each_port]

            # Check mandatory attributes
            for each_key in PORT_ATTRIBUTES:
                if each_key not in port_attr:
                    print("Error: " + each_key + " of " + each_port + " is/are missing")
                    return False

            #Validate port attributes for each port
            if not check_port_attr(port_attr):
                return False
    except IOError:
        print("Error: Cannot open file " + hwsku_json_file)
        return False
    except ValueError as e:
        print("Error in parsing json file " + hwsku_json_file + " ")
        print(str(e))
        return False
    return True

def main(argv):
    if len(argv) > 0 and argv[0] == "-h":
        usage()

    # Load target file
    if len(argv) == 0:
        files = glob.glob(HWSKU_JSON)
    else:
        files = argv

    all_good = True

    for f in files:
        good = check_file(f)
        if good:
            print("File " + f + " passed validity check")
        else:
            print("File " + f + " failed validity check")

        all_good = all_good and good

    if not all_good:
        sys.exit(-1)


if __name__ == "__main__":
    main(sys.argv[1:])
